home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 10 / FreelogHS10.iso / Buzz / Buzz_Advanced_Pack.exe / {app} / Dev / Mdk / am3000.cpp next >
C/C++ Source or Header  |  2001-08-27  |  3KB  |  216 lines

  1.  
  2. #include "stdafx.h"
  3. #include "../../hans/MachineInterface.h"
  4. #include "../../mdk/mdk.h"
  5.  
  6. namespace am3000
  7. {
  8.  
  9.  
  10. CMachineParameter const paraRate = { pt_byte, "Rate", "Modulation rate", 0, 127, 255, MPF_STATE, 0 };
  11. CMachineParameter const paraDepth = { pt_byte, "Depth", "Modulation depth", 0, 127, 255, MPF_STATE, 0 };
  12.  
  13. CMachineParameter const *pParameters[] = 
  14.     // global
  15.     ¶Rate,
  16.     ¶Depth
  17. };
  18.  
  19.  
  20. #pragma pack(1)        
  21.  
  22. class gvals
  23. {
  24. public:
  25.     byte rate;
  26.     byte depth;
  27. };
  28.  
  29.  
  30. #pragma pack()
  31.  
  32. CMachineInfo const MacInfo = 
  33. {
  34.     MT_EFFECT,                                // type
  35.     MI_VERSION,    
  36.     MIF_DOES_INPUT_MIXING,                    // flags
  37.     0,                                        // min tracks
  38.     0,                                        // max tracks
  39.     2,                                        // numGlobalParameters
  40.     0,                                        // numTrackParameters
  41.     pParameters,
  42.     0,
  43.     NULL,
  44. #ifdef _DEBUG
  45.     "Jeskola AM 3000 (Debug build)",        // name
  46. #else
  47.     "Jeskola AM 3000",                    // name
  48. #endif
  49.     "AM 3000",                                    // short name
  50.     "Oskari Tammelin",                        // author
  51.     NULL
  52. };
  53.  
  54.  
  55. class miex : public CMDKMachineInterfaceEx
  56. {
  57.  
  58. };
  59.  
  60. class mi : public CMDKMachineInterface
  61. {
  62. public:
  63.     mi();
  64.     virtual ~mi();
  65.  
  66.     virtual void Tick();
  67.  
  68.     virtual void MDKInit(CMachineDataInput * const pi);
  69.     virtual bool MDKWork(float *psamples, int numsamples, int const mode);
  70.     virtual bool MDKWorkStereo(float *psamples, int numsamples, int const mode);
  71.  
  72.     virtual void Command(int const i);
  73.  
  74.     
  75.     virtual void MDKSave(CMachineDataOutput * const po);
  76.  
  77.  
  78. public:
  79.     virtual CMDKMachineInterfaceEx *GetEx() { return &ex; }
  80.     virtual void OutputModeChanged(bool stereo) {}
  81.  
  82.  
  83. public:
  84.     miex ex;
  85.  
  86.  
  87. public:
  88.     
  89.     
  90.     dword Phase;
  91.  
  92.     
  93.     gvals gval;
  94.  
  95. };
  96.  
  97.  
  98. mi::mi()
  99. {
  100.     GlobalVals = &gval;
  101. }
  102.  
  103.  
  104. mi::~mi()
  105. {
  106.  
  107. }
  108.  
  109.  
  110.  
  111.  
  112.  
  113. #define SINETABLE_BITS    11
  114. #define SINETABLE_SIZE    (1 << SINETABLE_BITS)
  115. static short const *SineTable;
  116.  
  117. inline short fastsin(dword const phase)
  118. {
  119.     int i0 = (phase >> (32 - SINETABLE_BITS));
  120.     short s0 = SineTable[i0];
  121.     short s1 = SineTable[(i0 + 1) & (SINETABLE_SIZE - 1)];
  122.  
  123.     double a = (phase & ((1 << (32 - SINETABLE_BITS)) - 1)) * (1.0 / (1 << (32 - SINETABLE_BITS)));
  124.  
  125.     return s0 + a * (s1 - s0);
  126. }
  127.  
  128.  
  129. void mi::MDKInit(CMachineDataInput * const pi)
  130. {
  131.  
  132.  
  133.  
  134.     Phase = 0;
  135.     SineTable = pCB->GetOscillatorTable(OWF_SINE);
  136. }
  137.  
  138. void mi::MDKSave(CMachineDataOutput * const po)
  139. {
  140.  
  141. }
  142.  
  143.  
  144. void mi::Tick()
  145. {
  146.  
  147.  
  148. bool mi::MDKWork(float *psamples, int numsamples, int const mode)
  149. {
  150.     if (!(mode & WM_READ) || !(mode & WM_WRITE))
  151.     {
  152.     
  153.         return false;
  154.     }
  155.     
  156.     do
  157.     {
  158.         double s = *psamples;
  159.  
  160.         s *= 1.0 - (fastsin(Phase) + 32768) * (0.9 / 65536.0);
  161.  
  162.         Phase += 65536*4;
  163.         
  164.  
  165.         *psamples++ = (float)s;
  166.  
  167.     } while(--numsamples);
  168.  
  169.     return true;
  170. }
  171.  
  172. bool mi::MDKWorkStereo(float *psamples, int numsamples, int const mode)
  173. {
  174.     if (!(mode & WM_READ) || !(mode & WM_WRITE))
  175.     {
  176.     
  177.         return false;
  178.     }
  179.     
  180.     do
  181.     {
  182.         double l = psamples[0];
  183.         double r = psamples[1];
  184.  
  185.         l *= 1.0 - (fastsin(Phase) + 32768) * (0.9 / 65536.0);
  186.         r *= 1.0 - (fastsin(Phase*1.1) + 32768) * (0.9 / 65536.0);
  187.  
  188.         Phase += 65536*9;
  189.         
  190.  
  191.         psamples[0] = (float)l;
  192.         psamples[1] = (float)r;
  193.         psamples += 2;
  194.  
  195.     } while(--numsamples);
  196.  
  197.  
  198.     return true;
  199. }
  200.  
  201.  
  202.  
  203.  
  204. void mi::Command(int const i)
  205. {
  206. }
  207.  
  208.  
  209. }
  210.  
  211.  
  212. DLL_EXPORTS_NS(am3000, InitAM3000)
  213.  
  214.